Рекурсивная агрегация данных в древовидной структуре
Редактировал(а) Alexandr Fokin 2023/12/16 14:12
WITH RECURSIVE r AS (
-- Нижний уровень дерева (наиболее отдаленный от корня)
SELECT distinct
1 AS i,
s.id,
s.name,
s.parent,
--Локальная сумма (на текущем уровне)
sum(COALESCE (t.sum, 0))
over (PARTITION by s.id)
as localSum,
-- Глобальная сумма (агрегирует локальную сумму и сумму подуровне)
sum(COALESCE (t.sum, 0))
over (PARTITION by s.id)
as globalSum
from storage s
left join transaction t
on s.id = t.storage
where
s.id not in
(
select s2.parent
from storage s2
where s2.parent is not null
)
UNION
-- Последующий уровень вверх
SELECT distinct
i+1 AS i,
s.id,
s.name,
s.parent,
--Локальная сумма (на текущем уровне)
sum(COALESCE (t.sum, 0))
over (PARTITION by s.id)
as localSum,
-- Глобальная сумма (агрегирует локальную сумму и сумму подуровне)
sum(COALESCE (t.sum, 0) + r.globalSum)
over (PARTITION by s.id)
as globalSum
FROM storage s
join r
on r.parent = s.id
left join transaction t
on s.id = t.storage
)
SELECT
r.*
FROM r
order by r.id
-- Нижний уровень дерева (наиболее отдаленный от корня)
SELECT distinct
1 AS i,
s.id,
s.name,
s.parent,
--Локальная сумма (на текущем уровне)
sum(COALESCE (t.sum, 0))
over (PARTITION by s.id)
as localSum,
-- Глобальная сумма (агрегирует локальную сумму и сумму подуровне)
sum(COALESCE (t.sum, 0))
over (PARTITION by s.id)
as globalSum
from storage s
left join transaction t
on s.id = t.storage
where
s.id not in
(
select s2.parent
from storage s2
where s2.parent is not null
)
UNION
-- Последующий уровень вверх
SELECT distinct
i+1 AS i,
s.id,
s.name,
s.parent,
--Локальная сумма (на текущем уровне)
sum(COALESCE (t.sum, 0))
over (PARTITION by s.id)
as localSum,
-- Глобальная сумма (агрегирует локальную сумму и сумму подуровне)
sum(COALESCE (t.sum, 0) + r.globalSum)
over (PARTITION by s.id)
as globalSum
FROM storage s
join r
on r.parent = s.id
left join transaction t
on s.id = t.storage
)
SELECT
r.*
FROM r
order by r.id
Aggregate functions are not allowed in a recursive query. Is there an alternative way to write this query?
https://stackoverflow.com/questions/57299663/aggregate-functions-are-not-allowed-in-a-recursive-query-is-there-an-alternativ